/**
 * Copyright(c) 2013 Jade Techonologies Co., Ltd.
 *
 * History:
 *   13-7-11 上午11:24 Created by sky
 */
package com.jade.modules.message.sms.comm;

import com.jade.modules.message.sms.SmsMessage;
import com.jade.modules.message.sms.SmsReport;
import com.jade.modules.message.sms.SmsResult;
import com.jade.modules.message.sms.SmsServiceParams;

/**
 * 协议适配器。
 *
 * @author sky
 * @version 1.0 13-7-11 上午11:24
 */
public interface ProtocolAdapter
{
    /**
     * 设置配置信息。
     *
     * @param configuration 配置对象。
     */
    public void setConfiguration(SmsConfiguration configuration);

    /**
     * 创建Bind请求。
     *
     * @return Bind请求。
     */
    public <Bind extends SmsRequest> Bind createBind();

    /**
     * 创建心跳检测包.
     *
     * @return 心跳检测包。
     */
    public <Ping extends SmsRequest> Ping createPing();

    /**
     * 处理协议上非数据报文请求。
     *
     * @param request 请求
     * @return 完成后的响应。
     */
    public SmsResponse handleNonDataRequest(SmsRequest request);

    /**
     * 转换短消息为协议的Submit消息。
     *
     * @param sms    短消息
     * @param params 业务参数
     * @return 协议上的Submit消息
     */
    public <S extends SmsRequest> S toSubmit(SmsMessage sms, SmsServiceParams params);

    /**
     * 转换消息为协议上的Deliver消息。
     *
     * @param sms    短消息
     * @param params 业务参数
     * @return 协议上的Deliver或者Report(SGIP协议)消息。
     */
    public <D extends SmsRequest> D toDeliver(SmsMessage sms, SmsServiceParams params);

    /**
     * 转换消息为协议上的Report消息。
     *
     * @param report 状态报告
     * @param params 业务参数
     * @return 协议上的Deliver或者Report(SGIP协议)消息。
     */
    public <R extends SmsRequest> R toReport(SmsReport report, SmsServiceParams params);

    /**
     * 转换协议上的Submit, Deliver或者Report消息为短消息对象
     *
     * @param request 协议请求
     * @param params  业务参数
     * @return 短消息对象
     */
    public Object toMessage(SmsRequest request, SmsServiceParams params);

    /**
     * 根据协议请求和处理结果创建协议响应。
     *
     * @param request 协议请求
     * @param result  处理结果
     * @return 响应
     */
    public SmsResponse createResponse(SmsRequest request, SmsResult result);

    /**
     * 根据协议响应创建Sms结果。
     *
     * @param request  协议请求
     * @param response 协议响应
     * @return sms处理结果
     */
    public SmsResult createResult(SmsRequest request, SmsResponse response);
}
